package com.imut.lagain.service;
import org.slf4j.LoggerFactory;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.imut.lagain.entity.AccessLog;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 访问日志服务接口
 */
public interface IAccessLogService extends IService<AccessLog> {
    
    /**
     * 记录访问日志
     * @param userId 用户ID
     * @param ip IP地址
     * @param userAgent 用户代理
     * @param requestUri 请求URI
     * @param method 请求方法
     * @param statusCode 状态码
     * @param responseTime 响应时间（毫秒）
     * @return 是否记录成功
     */
    boolean logAccess(Long userId, String ip, String userAgent, String requestUri, 
                     String method, int statusCode, long responseTime);
    
    /**
     * 分页查询访问日志
     * @param page 页码
     * @param size 每页大小
     * @param userId 用户ID（可选）
     * @param ip IP地址（可选）
     * @param startTime 开始时间（可选）
     * @param endTime 结束时间（可选）
     * @return 访问日志分页数据
     */
    IPage<AccessLog> getAccessLogs(int page, int size, Long userId, String ip, 
                                  LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 统计访问数据
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 统计数据
     */
    Map<String, Object> getAccessStatistics(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 清理过期访问日志
     * @param days 保留天数
     * @return 删除的记录数
     */
    int cleanupExpiredLogs(int days);
    
    /**
     * 获取用户访问统计
     * @param userId 用户ID
     * @param days 天数
     * @return 访问统计
     */
    Map<String, Object> getUserAccessStats(Long userId, int days);
    
    /**
     * 获取热门访问路径
     * @param days 天数
     * @param limit 限制数量
     * @return 热门路径列表
     */
    List<Map<String, Object>> getPopularPaths(int days, int limit);
    
    /**
     * 获取IP访问统计
     * @param days 天数
     * @param limit 限制数量
     * @return IP统计列表
     */
    List<Map<String, Object>> getIpStats(int days, int limit);
    
    /**
     * 获取状态码统计
     * @param days 天数
     * @return 状态码统计
     */
    Map<Integer, Long> getStatusCodeStats(int days);
    
    /**
     * 获取用户代理统计
     * @param days 天数
     * @param limit 限制数量
     * @return 用户代理统计
     */
    List<Map<String, Object>> getUserAgentStats(int days, int limit);
    
    /**
     * 获取每小时访问统计
     * @param days 天数
     * @return 每小时访问统计
     */
    Map<String, Long> getHourlyAccessStats(int days);
    
    /**
     * 获取每日访问统计
     * @param days 天数
     * @return 每日访问统计
     */
    Map<String, Long> getDailyAccessStats(int days);
    
    /**
     * 获取平均响应时间
     * @param days 天数
     * @return 平均响应时间
     */
    double getAverageResponseTime(int days);
    
    /**
     * 获取响应时间分布
     * @param days 天数
     * @return 响应时间分布
     */
    Map<String, Long> getResponseTimeDistribution(int days);
    
    /**
     * 获取请求方法统计
     * @param days 天数
     * @return 请求方法统计
     */
    Map<String, Long> getMethodStats(int days);
    
    /**
     * 获取特定路径的访问统计
     * @param requestUri 请求URI
     * @param days 天数
     * @return 路径访问统计
     */
    Map<String, Object> getPathAccessStats(String requestUri, int days);
    
    /**
     * 获取错误请求统计
     * @param days 天数
     * @return 错误请求统计
     */
    Map<String, Long> getErrorStats(int days);
    
    /**
     * 获取用户访问趋势
     * @param userId 用户ID
     * @param days 天数
     * @return 访问趋势数据
     */
    Map<String, Object> getUserAccessTrend(Long userId, int days);
    
    /**
     * 获取系统负载统计
     * @param days 天数
     * @return 系统负载统计
     */
    Map<String, Object> getSystemLoadStats(int days);
    
    /**
     * 获取API调用统计
     * @param days 天数
     * @return API调用统计
     */
    Map<String, Object> getApiCallStats(int days);
    
    /**
     * 获取用户活跃度统计
     * @param days 天数
     * @return 用户活跃度统计
     */
    Map<String, Object> getUserActivityStats(int days);
    
    /**
     * 获取地理分布统计
     * @param days 天数
     * @return 地理分布统计
     */
    Map<String, Object> getGeoDistributionStats(int days);
    
    /**
     * 获取设备类型统计
     * @param days 天数
     * @return 设备类型统计
     */
    Map<String, Long> getDeviceTypeStats(int days);
    
    /**
     * 获取浏览器统计
     * @param days 天数
     * @return 浏览器统计
     */
    Map<String, Long> getBrowserStats(int days);
    
    /**
     * 获取操作系统统计
     * @param days 天数
     * @return 操作系统统计
     */
    Map<String, Long> getOsStats(int days);
    
    /**
     * 获取访问峰值时间
     * @param days 天数
     * @return 访问峰值时间
     */
    Map<String, Object> getPeakAccessTime(int days);
    
    /**
     * 获取异常访问检测
     * @param days 天数
     * @return 异常访问列表
     */
    List<Map<String, Object>> getAnomalyDetection(int days);
    
    /**
     * 获取用户会话统计
     * @param days 天数
     * @return 用户会话统计
     */
    Map<String, Object> getSessionStats(int days);
    
    /**
     * 获取API成功率统计
     * @param days 天数
     * @return API成功率统计
     */
    Map<String, Double> getApiSuccessRateStats(int days);
    
    /**
     * 获取API响应时间趋势
     * @param days 天数
     * @return API响应时间趋势
     */
    Map<String, Object> getApiResponseTimeTrend(int days);
    
    /**
     * 获取API调用频率统计
     * @param days 天数
     * @return API调用频率统计
     */
    Map<String, Object> getApiCallFrequencyStats(int days);
    
    /**
     * 获取API错误类型统计
     * @param days 天数
     * @return API错误类型统计
     */
    Map<String, Long> getApiErrorTypeStats(int days);
    
    /**
     * 获取API版本使用统计
     * @param days 天数
     * @return API版本使用统计
     */
    Map<String, Long> getApiVersionUsageStats(int days);
    
    /**
     * 获取API客户端统计
     * @param days 天数
     * @return API客户端统计
     */
    Map<String, Long> getApiClientStats(int days);
    
    /**
     * 获取API地域访问统计
     * @param days 天数
     * @return API地域访问统计
     */
    Map<String, Object> getApiGeoAccessStats(int days);
    
    /**
     * 获取API流量统计
     * @param days 天数
     * @return API流量统计
     */
    Map<String, Object> getApiTrafficStats(int days);
    
    /**
     * 获取API安全事件统计
     * @param days 天数
     * @return API安全事件统计
     */
    Map<String, Long> getApiSecurityEventStats(int days);
    
    /**
     * 获取API性能瓶颈分析
     * @param days 天数
     * @return API性能瓶颈分析
     */
    Map<String, Object> getApiPerformanceBottleneckAnalysis(int days);
    
    /**
     * 获取API资源消耗统计
     * @param days 天数
     * @return API资源消耗统计
     */
    Map<String, Object> getApiResourceConsumptionStats(int days);
    
    /**
     * 获取API依赖服务统计
     * @param days 天数
     * @return API依赖服务统计
     */
    Map<String, Object> getApiDependencyServiceStats(int days);
    
    /**
     * 获取API缓存命中率统计
     * @param days 天数
     * @return API缓存命中率统计
     */
    Map<String, Double> getApiCacheHitRateStats(int days);
    
    /**
     * 获取API数据库访问统计
     * @param days 天数
     * @return API数据库访问统计
     */
    Map<String, Object> getApiDatabaseAccessStats(int days);
    
    /**
     * 获取API外部服务调用统计
     * @param days 天数
     * @return API外部服务调用统计
     */
    Map<String, Object> getApiExternalServiceCallStats(int days);
    
    /**
     * 获取API重试次数统计
     * @param days 天数
     * @return API重试次数统计
     */
    Map<String, Long> getApiRetryCountStats(int days);
    
    /**
     * 获取API超时统计
     * @param days 天数
     * @return API超时统计
     */
    Map<String, Long> getApiTimeoutStats(int days);
    
    /**
     * 获取API并发访问统计
     * @param days 天数
     * @return API并发访问统计
     */
    Map<String, Object> getApiConcurrencyStats(int days);
    
    /**
     * 获取API限流事件统计
     * @param days 天数
     * @return API限流事件统计
     */
    Map<String, Long> getApiRateLimitEventStats(int days);
    
    /**
     * 获取API熔断事件统计
     * @param days 天数
     * @return API熔断事件统计
     */
    Map<String, Long> getApiCircuitBreakerEventStats(int days);
    
    /**
     * 获取API降级事件统计
     * @param days 天数
     * @return API降级事件统计
     */
    Map<String, Long> getApiDegradationEventStats(int days);
    
    /**
     * 获取API告警事件统计
     * @param days 天数
     * @return API告警事件统计
     */
    Map<String, Long> getApiAlertEventStats(int days);
    
    /**
     * 获取API日志级别统计
     * @param days 天数
     * @return API日志级别统计
     */
    Map<String, Long> getApiLogLevelStats(int days);
    
    /**
     * 获取API链路追踪统计
     * @param days 天数
     * @return API链路追踪统计
     */
    Map<String, Object> getApiTraceStats(int days);
    
    /**
     * 获取API监控指标统计
     * @param days 天数
     * @return API监控指标统计
     */
    Map<String, Object> getApiMonitoringMetricsStats(int days);
    
    /**
     * 验证用户是否为管理员
     * @param userId 用户ID
     * @return 是否为管理员
     */
    boolean isAdmin(Long userId);
}